/*
 * Copyright 2012 alex.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.mkdir.ejb;

import java.security.Principal;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.ejb.LocalBean;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.inject.Inject;
import org.mkdir.dao.FelhasznaloDAO;
import org.mkdir.dao.FelhasznaloSzerepkorDAO;
import org.mkdir.model.Dokumentum;
import org.mkdir.model.Felhasznalo;
import org.mkdir.model.Szerepkor;
import org.mkdir.util.JelszoUtil;

/**
 *
 * @author alex
 */
@LocalBean
@Stateless
public class FelhasznaloService {

    @Resource
    private SessionContext sessionContext;
    @Inject
    private EmailService emailService;
    @Inject
    private FelhasznaloDAO felhasznaloDAO;
    @Inject
    private FelhasznaloSzerepkorDAO felhasznaloSzerepkorDAO;
    @Inject
    private RendszerBeallitasokService rendszerBeallitasokService;
    @Inject
    private DokumentumService dokumentumService;

    public Felhasznalo getBejelentkezettFelhasznalo() {
        Principal principal = sessionContext.getCallerPrincipal();
        Felhasznalo user = felhasznaloDAO.findByEmail(principal.getName());
        return user;
    }

    public List<Felhasznalo> getOsszesFelhasznalo() {
        return felhasznaloDAO.findAll();
    }

    public void modosit(Felhasznalo felhasznalo) {
        felhasznaloDAO.edit(felhasznalo);
    }

    public void modosit(Felhasznalo felhasznalo, Collection<Szerepkor> szerepkorok) {
        felhasznaloDAO.edit(felhasznalo);
        felhasznaloSzerepkorDAO.szerkeszt(felhasznalo, szerepkorok);
    }

    public void inaktival(Felhasznalo felhasznalo) {
        felhasznaloSzerepkorDAO.torolSzerepkorok(felhasznalo);
        felhasznaloSzerepkorDAO.hozzaadSzerepkorok(felhasznalo, Arrays.asList(Szerepkor.INAKTIV));
        dokumentumService.lomtarbaHelyez(dokumentumService.getLetrehozottEloDokumentumok(felhasznalo));
        emailService.emailInaktivalFelhasznalo(felhasznalo);
    }

    public void aktival(Felhasznalo felhasznalo) {
        felhasznaloSzerepkorDAO.torolSzerepkorok(felhasznalo);
        felhasznaloSzerepkorDAO.hozzaadSzerepkorok(felhasznalo, Arrays.asList(Szerepkor.FELHASZNALO));
        emailService.emailAktivalFelhasznalo(felhasznalo);
    }

    public Felhasznalo getFelhasznalo(Integer id) {
        return felhasznaloDAO.find(id);
    }

    public Felhasznalo getAlapertelmezettFelhasznaloMinta() {
        Felhasznalo felhasznalo = new Felhasznalo();
        felhasznalo.setStilus(rendszerBeallitasokService.getAlepertelmezettTema().getErtek());
        felhasznalo.setLomtarHasznalata(true);
        felhasznalo.setEmailErtesites(true);
        felhasznalo.setTarhely(Integer.parseInt(rendszerBeallitasokService.getAlapertelmezettTarhely().getErtek()));
        felhasznalo.setInfoAblakMegjlHossza(Integer.parseInt(rendszerBeallitasokService.getInfoAblakMegjHossz().getErtek()));

        return felhasznalo;
    }

    //bájtban
    public Long getHasznaltTarhely(Felhasznalo felhasznalo) {
        Long ret = 0L;
        for (Dokumentum dok : dokumentumService.getOsszesLetrehozottDokumentumok(felhasznalo)) {
            ret += dok.getMeret();
        }
        return ret;
    }

    public Integer getFoglaltTarhelySzazalekban(Felhasznalo felhasznalo) {
        if (felhasznalo.getTarhely() == 0) {
            return -1;
        }
        Long tarhelyBajtban = felhasznalo.getTarhely() * 1024 * 1024L;
        return Math.round(getHasznaltTarhely(felhasznalo) / (float) tarhelyBajtban * 100);
    }

    //Szabadtárhely bájtban
    public Long getSzabadTarhely(Felhasznalo felhasznalo) {
        return felhasznalo.getTarhely() * 1024 * 1024 - getHasznaltTarhely(felhasznalo);
    }

    public void letrehoz(Felhasznalo felhasznalo, Felhasznalo letrehozo, Collection<Szerepkor> szerepkorok) {
        felhasznalo.setLetrehozva(new Date());
        felhasznalo.setFelhasznalo(letrehozo);
        String jelszo = JelszoUtil.jelszoGeneralasa(1, 1, 1, 8);
        felhasznalo.setJelszo(jelszo);
        emailService.emailRegisztralFelhasznalo(felhasznalo, jelszo);
        felhasznaloDAO.create(felhasznalo);
        felhasznaloSzerepkorDAO.hozzaadSzerepkorok(felhasznalo, szerepkorok);
    }

    public boolean isSzerepkorben(Felhasznalo felhasznalo, Szerepkor szerepkor) {
        return felhasznaloSzerepkorDAO.getSzerepkorok(felhasznalo).contains(szerepkor);
    }

    public void generalUjJelszo(Felhasznalo felhasznalo) {
        String jelszo = JelszoUtil.jelszoGeneralasa(1, 1, 1, 8);
        felhasznalo.setJelszo(jelszo);
        felhasznaloDAO.edit(felhasznalo);
        emailService.emailUjJelszo(felhasznalo, jelszo);
    }
}
